// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package base

import (
	"os"
	"path/filepath"
	"strings"
	"sync"
)

var cwd string
var cwdOnce sync.Once

// Cwd返回第一次调用时的当前工作目录。
func Cwd() string {
	cwdOnce.Do(func() {
		var err error
		cwd, err = os.Getwd()
		if err != nil {
			Fatalf("cannot determine current directory: %v", err)
		}
	})
	return cwd
}

// ShortPath返回路径的绝对或相对名称，长度越短越好。
func ShortPath(path string) string {
	if rel, err := filepath.Rel(Cwd(), path); err == nil && len(rel) < len(path) {
		return rel
	}
	return path
}

// RelPaths返回绝对路径的副本，如果绝对路径更短，则返回相对于当前目录的路径。
func RelPaths(paths []string) []string {
	var out []string
	for _, p := range paths {
		rel, err := filepath.Rel(Cwd(), p)
		if err == nil && len(rel) < len(p) {
			p = rel
		}
		out = append(out, p)
	}
	return out
}

// IsTestFile报告源文件是否是一组测试，因此应将其排除在覆盖率分析之外。
func IsTestFile(file string) bool {
	// 我们不介绍测试，只介绍他们测试的代码。
	return strings.HasSuffix(file, "_test.go")
}
